package com.example.load_dex;

import android.content.Context;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import dalvik.system.DexClassLoader;

public class Load_dex {
    public static void testDexClassLoader(Context context, String dexfilepath){
        File optfile=context.getDir("opt_dex",0); //在app私有目录新建文件opt_dex 用于存放dex文件
        File libfile=context.getDir("lib_path",0);//在app私有目录新建文件，用于存放so文件
        //  ClassLoader parent获取的两种方式
        ClassLoader parentClassloader=MainActivity.class.getClassLoader();
        ClassLoader tmpClassLoader=context.getClassLoader();
        /** 加载sdcard下的dex
         * arg1 dex文件路径
         * arg2 app私有目录文件opt_dex路径
         * arg3 app私有目录文件lib_path路径
         * arg4 parentClassloader 父类装载器
         **/
        DexClassLoader dexClassLoader=new DexClassLoader(dexfilepath,optfile.getAbsolutePath(),libfile.getAbsolutePath(),parentClassloader);
        Class<?> clazz=null;
        try {
            //加载类
            clazz = dexClassLoader.loadClass("com.example.test_dex.TestClass");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if(clazz!=null){
            try {
                //通过反射获取testFuncMethod方法。
                Method testFuncMethod=clazz.getDeclaredMethod("testFunc");
                //因为不是静态的所以要创建对象然后在完成调用
                Object obj=clazz.newInstance();
                testFuncMethod.invoke(obj);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }

    }
}
